home *** CD-ROM | disk | FTP | other *** search
Wrap
package sun.tools.javac; import java.io.PrintStream; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import sun.tools.asm.Assembler; import sun.tools.java.ClassDeclaration; import sun.tools.java.ClassDefinition; import sun.tools.java.ClassNotFound; import sun.tools.java.Constants; import sun.tools.java.Environment; import sun.tools.java.FieldDefinition; import sun.tools.java.Identifier; import sun.tools.java.Type; import sun.tools.tree.CompoundStatement; import sun.tools.tree.Context; import sun.tools.tree.Expression; import sun.tools.tree.ExpressionStatement; import sun.tools.tree.LocalField; import sun.tools.tree.MethodExpression; import sun.tools.tree.Node; import sun.tools.tree.Statement; import sun.tools.tree.SuperExpression; public final class SourceField extends FieldDefinition implements Constants { Vector args; FieldDefinition abstractSource; int status; static final int PARSED = 0; static final int CHECKING = 1; static final int CHECKED = 2; static final int INLINING = 3; static final int INLINED = 4; static final int ERROR = 5; public Vector getArguments() { return this.args; } public SourceField(int var1, ClassDefinition var2, String var3, int var4, Type var5, Identifier var6, Vector var7, ClassDeclaration[] var8, Node var9) { super(var1, var2, var4, var5, var6, var8, var9); super.documentation = var3; if (((FieldDefinition)this).isMethod()) { this.args = new Vector(); if (((FieldDefinition)this).isConstructor() || !((FieldDefinition)this).isStatic()) { this.args.addElement(new LocalField(var1, var2, 0, var2.getType(), Constants.idThis)); } if (var7 != null) { Enumeration var10 = var7.elements(); Type[] var11 = ((FieldDefinition)this).getType().getArgumentTypes(); for(int var12 = 0; var12 < var11.length; ++var12) { this.args.addElement(new LocalField(var1, var2, 0, var11[var12], (Identifier)var10.nextElement())); } } } } public SourceField(FieldDefinition var1, ClassDefinition var2, Environment var3) { this(var1.getWhere(), var2, var1.getDocumentation(), var1.getModifiers() | 1024, var1.getType(), var1.getName(), (Vector)null, var1.getExceptions(var3), (Node)null); this.args = var1.getArguments(); this.abstractSource = var1; } public final ClassDeclaration getDefiningClassDeclaration() { return this.abstractSource == null ? super.getDefiningClassDeclaration() : this.abstractSource.getDefiningClassDeclaration(); } public Identifier resolve(Environment var1, Identifier var2) throws ClassNotFound { return ((SourceClass)((FieldDefinition)this).getClassDefinition()).imports.resolve(var1, var2); } public void check(Environment var1) throws ClassNotFound { if (this.status == 0) { if (var1.dump()) { System.out.println("[check field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]"); if (((FieldDefinition)this).getValue() != null) { ((FieldDefinition)this).getValue().print(System.out); System.out.println(); } } var1 = new Environment(var1, this); var1.resolve(super.where, ((FieldDefinition)this).getClassDefinition(), ((FieldDefinition)this).getType()); if (((FieldDefinition)this).isMethod()) { ClassDeclaration var2 = var1.getClassDeclaration(Constants.idJavaLangThrowable); ClassDeclaration[] var3 = ((FieldDefinition)this).getExceptions(var1); for(int var4 = 0; var4 < var3.length; ++var4) { ClassDefinition var5; try { var5 = var3[var4].getClassDefinition(var1); } catch (ClassNotFound var16) { var1.error(super.where, "class.not.found", var16.name, "throws"); break; } if (!((FieldDefinition)this).getClassDefinition().canAccess(var1, var5.getClassDeclaration())) { var1.error(super.where, "cant.access.class", var5); } else if (!var5.subClassOf(var1, var2)) { var1.error(super.where, "throws.not.throwable", var5); } } } this.status = 1; if (((FieldDefinition)this).isMethod() && this.args != null) { int var18 = this.args.size(); label146: for(int var20 = 0; var20 < var18; ++var20) { LocalField var23 = (LocalField)this.args.elementAt(var20); Identifier var26 = ((FieldDefinition)var23).getName(); for(int var6 = var20 + 1; var6 < var18; ++var6) { Identifier var7 = ((LocalField)this.args.elementAt(var6)).getName(); if (var26.equals(var7)) { var1.error(((FieldDefinition)this).getWhere(), "duplicate.argument", var26); break label146; } } } } if (((FieldDefinition)this).getValue() != null) { Context var19 = new Context(this); if (((FieldDefinition)this).isMethod()) { Object var21 = (Statement)((FieldDefinition)this).getValue(); long var24 = 0L; LocalField var30; for(Enumeration var28 = this.args.elements(); var28.hasMoreElements(); var24 |= 1L << var19.declare(var1, var30)) { var30 = (LocalField)var28.nextElement(); } if (((FieldDefinition)this).isConstructor()) { var24 &= -2L; if (!((Statement)var21).firstConstructor() && ((FieldDefinition)this).getClassDefinition().getSuperClass() != null) { Statement[] var31 = new Statement[]{new ExpressionStatement(super.where, new MethodExpression(super.where, new SuperExpression(super.where), Constants.idInit, new Expression[0])), (Statement)var21}; var21 = new CompoundStatement(super.where, var31); ((FieldDefinition)this).setValue((Node)var21); } } Hashtable var32 = new Hashtable(); ((Statement)var21).checkMethod(var1, var19, var24, var32); ClassDeclaration[] var8 = ((FieldDefinition)this).getExceptions(var1); ClassDeclaration var9 = var1.getClassDeclaration(Constants.idJavaLangError); ClassDeclaration var10 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException); Enumeration var11 = var32.keys(); while(var11.hasMoreElements()) { ClassDeclaration var12 = (ClassDeclaration)var11.nextElement(); ClassDefinition var13 = var12.getClassDefinition(var1); if (!var13.subClassOf(var1, var9) && !var13.subClassOf(var1, var10)) { boolean var14 = false; if (!((FieldDefinition)this).isInitializer()) { for(int var15 = 0; var15 < var8.length; ++var15) { if (var13.subClassOf(var1, var8[var15])) { var14 = true; } } } if (!var14) { Node var37 = (Node)var32.get(var12); var1.error(var37.getWhere(), ((FieldDefinition)this).isInitializer() ? "initializer.exception" : "uncaught.exception", var12.getName()); } } } } else { Hashtable var22 = new Hashtable(); Expression var25 = (Expression)((FieldDefinition)this).getValue(); var25.checkInitializer(var1, var19, (long)(((FieldDefinition)this).isStatic() ? 0 : 1), ((FieldDefinition)this).getType(), var22); ((FieldDefinition)this).setValue(((Node)var25).convert(var1, var19, ((FieldDefinition)this).getType(), var25)); ClassDeclaration var27 = var1.getClassDeclaration(Constants.idJavaLangThrowable); ClassDeclaration var29 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException); Enumeration var33 = var22.keys(); while(var33.hasMoreElements()) { ClassDeclaration var34 = (ClassDeclaration)var33.nextElement(); ClassDefinition var35 = var34.getClassDefinition(var1); if (!var35.subClassOf(var1, var29) && var35.subClassOf(var1, var27)) { Node var36 = (Node)var22.get(var34); var1.error(var36.getWhere(), "initializer.exception", var34.getName()); } } } if (var1.dump()) { ((FieldDefinition)this).getValue().print(System.out); System.out.println(); } } this.status = ((FieldDefinition)this).getClassDefinition().getError() ? 5 : 2; } } void inline(Environment var1) throws ClassNotFound { switch (this.status) { case 0: this.check(var1); this.inline(var1); return; case 1: default: return; case 2: if (var1.dump()) { System.out.println("[inline field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]"); } this.status = 3; var1 = new Environment(var1, this); if (((FieldDefinition)this).isMethod()) { if (!((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) { Context var2 = new Context(this); Enumeration var3 = this.args.elements(); while(var3.hasMoreElements()) { var2.declare(var1, (LocalField)var3.nextElement()); } ((FieldDefinition)this).setValue(((Statement)((FieldDefinition)this).getValue()).inline(var1, var2)); } } else if (((FieldDefinition)this).getValue() != null) { Context var5 = new Context(this); ((FieldDefinition)this).setValue(((Expression)((FieldDefinition)this).getValue()).inlineValue(var1, var5)); } if (var1.dump()) { System.out.println("[inlined field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]"); if (((FieldDefinition)this).getValue() != null) { ((FieldDefinition)this).getValue().print(System.out); System.out.println(); } else { System.out.println("<empty>"); } } this.status = 4; } } public Node getValue(Environment var1) throws ClassNotFound { if (((FieldDefinition)this).getValue() == null) { return null; } else { switch (this.status) { case 0: this.check(var1); return this.getValue(var1); case 2: this.inline(var1); return this.getValue(var1); case 4: return ((FieldDefinition)this).getValue(); default: return null; } } } public boolean isInlineable(Environment var1, boolean var2) throws ClassNotFound { if (super.isInlineable(var1, var2)) { this.getValue(var1); return this.status == 4 && !((FieldDefinition)this).getClassDefinition().getError(); } else { return false; } } public Object getInitialValue() { return !((FieldDefinition)this).isMethod() && ((FieldDefinition)this).getValue() != null && ((FieldDefinition)this).isFinal() && this.status == 4 ? ((Expression)((FieldDefinition)this).getValue()).getValue() : null; } public void code(Environment var1, Assembler var2) throws ClassNotFound { switch (this.status) { case 0: this.check(var1); this.code(var1, var2); return; case 2: this.inline(var1); this.code(var1, var2); return; case 4: if (var1.dump()) { System.out.println("[code field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]"); } if (((FieldDefinition)this).isMethod() && !((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) { var1 = new Environment(var1, this); Context var3 = new Context(this); Statement var4 = (Statement)((FieldDefinition)this).getValue(); Enumeration var5 = this.args.elements(); while(var5.hasMoreElements()) { LocalField var6 = (LocalField)var5.nextElement(); var3.declare(var1, var6); } if (var4 != null) { var4.code(var1, var3, var2); } if (((FieldDefinition)this).getType().getReturnType().isType(11) && !((FieldDefinition)this).isInitializer()) { var2.add(((FieldDefinition)this).getWhere(), 177); } } return; default: } } public void codeInit(Environment var1, Context var2, Assembler var3) throws ClassNotFound { if (!((FieldDefinition)this).isMethod()) { switch (this.status) { case 0: this.check(var1); this.codeInit(var1, var2, var3); return; case 2: this.inline(var1); this.codeInit(var1, var2, var3); return; case 4: if (var1.dump()) { System.out.println("[code initializer " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]"); } if (((FieldDefinition)this).getValue() != null) { Expression var4 = (Expression)((FieldDefinition)this).getValue(); if (((FieldDefinition)this).isStatic()) { if (this.getInitialValue() == null && !var4.equalsDefault()) { var4.codeValue(var1, var2, var3); var3.add(((FieldDefinition)this).getWhere(), 179, this); return; } } else if (!var4.equalsDefault()) { var3.add(((FieldDefinition)this).getWhere(), 25, new Integer(0)); var4.codeValue(var1, var2, var3); var3.add(((FieldDefinition)this).getWhere(), 181, this); } } return; default: } } } public void print(PrintStream var1) { super.print(var1); if (((FieldDefinition)this).getValue() != null) { ((FieldDefinition)this).getValue().print(var1); var1.println(); } } }